"use client";

import { useState, useEffect } from "react";
import { trpc } from "@/app/_trpc/client";
import { useToast } from "@/components/ui/use-toast";
import useFormHandler from "@/hooks/useFormHandler";
import { z } from "zod";
import { projectAreaSchema } from "@/lib/schemas/projectAreaSchema";
import { Project } from "@/types";

interface AreaFormProps{
    project:any,
    isEdit?:boolean,
    editValues:any
}

const useAreaForm = ({ project, isEdit, editValues }: AreaFormProps) => {
  const [open, setOpen] = useState(false);
  const utils = trpc.useUtils();
  const { toast } = useToast();
  const [isCustomArea,setIsCustomArea]=useState<boolean>(false)

  const defaultValues: z.infer<typeof projectAreaSchema> = {
    width: 0,
    length: 0,
    floorId: "",
    type: "Piso",
    projectId: "",
    projectName: "",
    quantity: 1,
  };

  const {
    form,
    isInputChanged,
    setIsInputChanged,
    setFormValues,
    getChangedFields,
  } = useFormHandler(projectAreaSchema, defaultValues);

  useEffect(() => {
    if (open) {
      let initialValues = {
        projectId: project?.id!,
        projectName: project?.name!,
      };
      if (isEdit && editValues) {
        initialValues = { ...initialValues, ...editValues };
      }
      setFormValues(initialValues);
    }
  }, [open, project, isEdit, editValues]);

  const { mutate: createProjectAreaMutation, isPending: isPendingCreateArea } =
    trpc.areas.createProjectArea.useMutation({
      onSuccess: () => {
        setOpen(false);
        toast({ title: "Éxito", description: "Área añadida con éxito" });
        setIsInputChanged(false);
        utils.projects.getProjectById.invalidate({ value: project?.id! });
      },
      onError: (opts) => {
        toast({ title: "Error", description: opts?.message, variant: "destructive" });
      },
    });

  const { mutate: updateAreaMutation, isPending: isPendingUpdateArea } =
    trpc.areas.updateProjectArea.useMutation({
      onSuccess: () => {
        setOpen(false);
        toast({ title: "Éxito", description: "Área modificada con éxito" });
        setIsInputChanged(false);
        utils.projects.getProjectById.invalidate({ value: editValues?.projectId! });
      },
      onError: (opts) => {
        toast({ title: "Error", description: opts?.message, variant: "destructive" });
      },
    });

    const areaFormValue = form.watch('type')

    useEffect(()=>{
      if(areaFormValue.toLocaleLowerCase() === 'otro'){
        setIsCustomArea(true);
        form.setValue('type','')
      }
    },[areaFormValue,form])

    const resetCustomArea=()=>{setIsCustomArea(false)}

  const onSubmit = (values: z.infer<typeof projectAreaSchema>) => {
    let valuesCreateOrUpdate:any = values;
    if (isEdit) {
      const changedFields = getChangedFields(values);
      valuesCreateOrUpdate = {
        id: editValues?.id,
        projectId: values.projectId,
        projectName: values.projectName,
        floorId: values.floorId,
        ...changedFields,
      };
      updateAreaMutation(valuesCreateOrUpdate);
      return;
    }
    createProjectAreaMutation(values);
  };

  return {
    open,
    setOpen,
    form,
    isInputChanged,
    isPendingCreateArea,
    isPendingUpdateArea,
    onSubmit,
    isCustomArea,
    resetCustomArea
  };
};

export default useAreaForm;
